package de.preiscrawler.parser;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import net.htmlparser.jericho.TextExtractor;

import org.apache.log4j.Logger;

import de.preiscrawler.AlleAnbieter;
import de.preisrobot.entity.Artikel;
import de.preisrobot.service.internal.PreisRobotParserException;

/**
 * @author dhein
 *         Content in
 *         <tr class="listBGdark">
 *         </tr>
 *         <tr class="listBGlight">
 *         </tr>
 *         <tr class="listBGdark">
 */
public class IdealoParser  extends AbstractParser<Artikel> {

    private final Logger log = Logger.getLogger(IdealoParser.class);

    @Override
    protected void parseStream(final List<Artikel> list, final InputStream in) throws IOException,
            PreisRobotParserException {

        final Source source = new Source(in);

        final List<Element> elementList = source.getAllElementsByClass("listBGdark");
        final List<Element> elementList2 = source.getAllElementsByClass("listBGlight");

        if (elementList == null || elementList.size() == 0)
            throw new PreisRobotParserException("Element by class listBGdark was not found");

        elementList.addAll(elementList2);

        for (final Element element : elementList) {

            try {

          
                final Artikel artikel = getContent(element);
                list.add(artikel);

            } catch (final Exception e) {

                log.info(" ungueltiges Element " + element.getName() + " reason:" + e.getMessage());

            }

        }
    }

    private Artikel getContent(final Element element) {

          Artikel artikel =  new Artikel();

        final List<Element> allElementsByClass = element.getAllElementsByClass("osimg");
        final List<Element> allStartTags = element.getAllElements("td");

        final String preis = getPreis(element);
        final String beschreibung = getProductDescription(allStartTags);
        String imagelink = null;
        String beschreibungkurz = null;

        for (final Element element2 : allElementsByClass) {

            imagelink = element2.getAttributeValue("src");
            beschreibungkurz = element2.getAttributeValue("alt");
        }

        artikel.setPreis(preis);
        artikel.setArtikelNr(beschreibungkurz);
        artikel.setImageLink(imagelink);
        artikel.setCreationDate(new Date());
        artikel.setAnbieterId(AlleAnbieter.IDEALO);
        artikel.setDesc(beschreibung);

        return artikel;
    }

    private String getProductDescription(final List<Element> allStartTags) {

        String beschreibung = null;

        if (allStartTags != null && allStartTags.size() > 2) // es ist das 2. td
        // tag
        {
            final Element startTag = allStartTags.get(1);
            final TextExtractor textExtractor = startTag.getTextExtractor();
            beschreibung = textExtractor.toString();
        }
        return beschreibung;
    }

    private String getPreis(final Element element) {

        final List<Element> allElementsByClass = element.getAllElementsByClass("nobr");

        for (final Element element2 : allElementsByClass) {

            final String string = element2.getTextExtractor().toString();

            if (string != null && string.contains("euro"))
                return string;

        }

        return null;
    }

    @Override
    public int getAnbieter() {
        return AlleAnbieter.IDEALO;
    }

}
